#include <iostream>

#include <stdlib.h>

#include <string>

#include <fstream>

#include "bundle.h" // 嵌入式库表示可以直接在项目中使用 无需链接动态库

using namespace bundle;

void Manual(){
    std::cout << "Usage:"<<std::endl;
    std::cout << "\t"<<"./bundle"<<" "<<"[oldfilename]"<<" "<<"newfilename"<<std::endl;
    std::cout << std::endl;
}

int main(int argc, char *argv[])
{
    // 根据命令行参数接受需要压缩的文件名
    // 通过对应的方式将文件进行压缩
    if(argc<3){
        Manual();
        exit(-1);
    }

    std::string ifilename = argv[1]; // 用于接收对应文件名
    std::string ofilename = argv[2];

    std::ifstream ifs;
    ifs.open(ifilename,std::ios::binary); // 用二进制流的方式打开文件
    ifs.seekg(0,std::ios::end); // 跳转到文件末尾 主要是获取文件大小
    size_t fsize = ifs.tellg(); // 获取文件大小 - 文件偏移量
    ifs.seekg(0,std::ios::beg); // 获取文件大小后返回到文件头
    
    std::string body; // 用于接收文件内容
    body.resize(fsize); // 调整大小为文件大小
                        
    ifs.read(&body[0], fsize); // 采用另类的方式访问首地址位置
                               // 将文件内的所有数据读取至body处
                        
    ////////////////
    
    // 进行压缩

    std::string packed = bundle::pack(bundle::LZIP,body); // 选择一种方式(算法)对数据流进行压缩
                                                          // 此处选择使用lzip的形式压缩文件

    std::ofstream ofs;
    ofs.open(ofilename,std::ios::binary); // 以写的方式 二进制流的方式 打开

    // 将压缩后的数据以二进制流的方式写出
    // 压缩后的数据写入值压缩包文件
    ofs.write(&packed[0],packed.size());
    ifs.close();
    ofs.close();

    std::cout<<"hello world"<<std::endl;
    return 0;
}
